import axios, { AxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { store } from '@/store'
import router from '@/router/index'
// 使用create创建克隆一个axios实例request是为了不影响axios本身
const request = axios.create({
  // baseURL: 'https://shop.fed.lagou.com/api/admin' // 基础路径
  // baseURL: import.meta.env.VITE_API_BASEURL // 基础路径
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
  const user = store.state.user
  // 在发送请求之前做些什么
  if (user && user.token) {
    if (config.headers) {
      config.headers.Authorization = `Bearer ${user.token}`
    }
  }
  // config.headers.Authorization = `Bearer `
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})
// 防止当一个页面同时请求多个接口都是请求异常时会弹出多个弹窗
let isRefreshing = false
// 添加响应拦截器
request.interceptors.response.use(function (response) {
  const status = response.data.status
  // 对响应数据做点什么
  // 请求正常时
  if (!status || status === 200) {
    return response
  }
  // 请求异常时：如token失效
  if (status === 410000) {
    if (isRefreshing) return Promise.reject(response)
    isRefreshing = true
    ElMessageBox.confirm('登录失效，点击取消停留当前页面，确认返回登录页', '登录过期', {
      confirmButtonText: '确认',
      cancelButtonText: '取消'
    }).then((res) => {
      // 清除本地登录状态
      store.commit('setUser', null)
      // 跳回登录页
      router.push({
        name: 'login',
        query: {
          // redirect 设置为当前路由，以便登录后跳转到原路由
          redirect: router.currentRoute.value.fullPath
        }
      })
    }).finally(() => {
      isRefreshing = false
    })
    // 内部处理掉业务异常，这个Promise不能写在Promise内部（即不能写在then、finally、catch里面）
    return Promise.reject(response)
  }
  // 请求错误时处理
  ElMessage.error(response.data.msg || '请求失败，请稍后重试！')
  // 因为axios会返回一个promise所以可以手动抛出promise异常，从而停止执行后续代码
  return Promise.reject(response.data)
}, function (error) {
  // 对响应错误做点什么
  return Promise.reject(error)
})

export default <T = any>(config: AxiosRequestConfig) => {
  return request(config).then(res => {
    return (res.data.data || res.data) as T
  })
}
